home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / wdj0797.zip / SHMIDT.ZIP / VCALL.C < prev    next >
C/C++ Source or Header  |  1996-11-14  |  1KB  |  52 lines

  1. #include <windows.h>
  2.  
  3. /* VCALL32 Device IO Control subfunctions */
  4. typedef enum {
  5.    VCALL_GETVERSION=1,
  6.    VCALL_GETVCALL
  7. }VCALL_DIOC;
  8.  
  9. #pragma pack(1)
  10. /* FWORD PTR */
  11. typedef struct {
  12.    DWORD offs;
  13.    WORD  sel;
  14. }FWORD, *PFWORD;
  15.  
  16. FWORD cb;   /* PM API Callback */
  17.  
  18. BOOL WINAPI DllMain(HINSTANCE hDLLInst,
  19.                     DWORD fdwReason,
  20.                     LPVOID lpvReserved)
  21. {
  22. char *devname = "\\\\.\\VCALL32.VXD";
  23. HANDLE hVxD;
  24. DWORD out[1];                   // ioctl return values
  25.  
  26.    if (DLL_PROCESS_ATTACH == fdwReason)
  27.    {
  28.       hVxD = CreateFile(devname,0,0,NULL,0,
  29.                         FILE_FLAG_DELETE_ON_CLOSE,NULL);
  30.  
  31.       if (INVALID_HANDLE_VALUE == hVxD)
  32.          return (FALSE);
  33.          
  34.       DeviceIoControl (hVxD,VCALL_GETVCALL,NULL,0,out,sizeof(out),
  35.                        NULL,NULL);
  36.       cb.offs = ((PFWORD)out[0])->offs;
  37.       cb.sel = ((PFWORD)out[0])->sel;
  38.             
  39.       CloseHandle (hVxD);
  40.    }
  41.    return TRUE;
  42. }
  43.  
  44. _declspec(naked) void WINAPI VCall (DWORD svc)
  45. {
  46.    _asm {
  47.       pop   eax            /* retrieve return address */
  48.       xchg  eax, [esp]     /* exchange with Win32 service number */
  49.       call  fword ptr [cb] /* call PM callback */
  50.    }
  51. }
  52.